/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package th.manager;

import com.google.inject.Inject;
import com.wideplay.warp.persist.Transactional;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Hibernate;
import org.hibernate.Query;
import org.hibernate.Session;
import th.dao.KodHubunganDAO;
import th.dao.PermohonanMaklumatDAO;
import th.dao.PermohonanMaklumatKeluargaDAO;
import th.dao.PermohonanMaklumatKumpulanDAO;
import th.dao.PilihanDestinasiDAO;
import th.model.PermohonanMaklumat;
import th.model.PermohonanMaklumatKeluarga;
import th.model.PermohonanMaklumatKumpulan;
import th.model.PilihanDestinasi;


/**
 *
 * @author faizal.azlee
 */
public class HajjManager {
    
    @Inject
    protected com.google.inject.Provider<Session> sessionProvider;
    @Inject 
    private PermohonanMaklumatDAO permohonanMaklumatDAO;
    @Inject 
    private PermohonanMaklumatKeluargaDAO permohonanMaklumatKeluargaDAO;
    @Inject 
    private PermohonanMaklumatKumpulanDAO permohonanMaklumatKumpulanDAO;
    @Inject
    private KodHubunganDAO kodHubunganDAO;
    
    @Inject
    private PilihanDestinasiDAO pilihanDestinasiDAO;
   
    public List<PermohonanMaklumat> findAll() {
        String query = "SELECT a FROM mohon_maklumat a WHERE a.mohon_maklumat is not null ";
        Query q = sessionProvider.get().createQuery(query);
        return q.list();
    } 
     

    public PermohonanMaklumat findMohonMaklumatByNoAkaun(String noAkaun, String urusan) {        
        String query = "SELECT a FROM PermohonanMaklumat a WHERE a.urusan= :urusan AND a.noAkaun = :noAkaun";
        PermohonanMaklumat q = (PermohonanMaklumat)sessionProvider.get().createQuery(query).setString("noAkaun", noAkaun.toString()).setString("urusan", urusan.toString()).uniqueResult();
        if(q != null){
            Hibernate.initialize(q.getSenaraiMaklumatKeluarga());
            Hibernate.initialize(q.getSenaraiMaklumatWaris());
            Hibernate.initialize(q.getSenaraiMaklumatKumpulan());
            Hibernate.initialize(q.getUrusan());
            Hibernate.initialize(q.getStatus());
            Hibernate.initialize(q.getStatusHaji());
            Hibernate.initialize(q.getPerkahwinan());
            Hibernate.initialize(q.getSektorPekerjaan());
            Hibernate.initialize(q.getPendidikan());
            Hibernate.initialize(q.getNegeri());
            Hibernate.initialize(q.getHubungan());
            Hibernate.initialize(q.getTempatLahir());
            Hibernate.initialize(q.getSenaraiPilihanDestinasi());
            Hibernate.initialize(q.getHubunganMahram());
            Hibernate.initialize(q.getNamaMahram()); 
            Hibernate.initialize(q.getNoAkaunMahram()); 
            Hibernate.initialize(q.getDobMahram());
            Hibernate.initialize(q.getNoKpMahram()); 
        }
        return q;
    } 
    
    public PermohonanMaklumat findMohonMaklumatById(Integer id) {       
  
        PermohonanMaklumat q = permohonanMaklumatDAO.findById(id);
        if(q != null){
            Hibernate.initialize(q.getSenaraiMaklumatKeluarga());
            Hibernate.initialize(q.getSenaraiMaklumatWaris());
            Hibernate.initialize(q.getSenaraiMaklumatKumpulan());
            Hibernate.initialize(q.getUrusan());
            Hibernate.initialize(q.getStatus());
            Hibernate.initialize(q.getStatusHaji());
            Hibernate.initialize(q.getPerkahwinan());
            Hibernate.initialize(q.getSektorPekerjaan());
            Hibernate.initialize(q.getPendidikan());
            Hibernate.initialize(q.getNegeri());
            Hibernate.initialize(q.getHubungan());
            Hibernate.initialize(q.getTempatLahir());
            Hibernate.initialize(q.getSenaraiPilihanDestinasi());
        }
        return q;        
    } 
    
    
    @Transactional
    public PermohonanMaklumat saveMohonMaklumat(PermohonanMaklumat obj) {
        return permohonanMaklumatDAO.saveOrUpdate(obj);
    }
    
    @Transactional
    public void deleteMohonMaklumat(PermohonanMaklumat obj) {
        permohonanMaklumatDAO.delete(obj);
    }
    
    @Transactional
    public void deleteSenaraiMohonMaklumatKumpulan(List permohonanMaklumatKumpulanList) {
        for ( int i=0; i<permohonanMaklumatKumpulanList.size(); i++)
        {
            PermohonanMaklumatKumpulan obj = (PermohonanMaklumatKumpulan)permohonanMaklumatKumpulanList.get(i);
            permohonanMaklumatKumpulanDAO.delete(obj);
        }        
    }
    
    public PermohonanMaklumatKeluarga findMohonMaklumatKeluargaById(Integer id) {        
        PermohonanMaklumatKeluarga q = permohonanMaklumatKeluargaDAO.findById(id);
        if(q != null){
            Hibernate.initialize(q.getStatus());
            Hibernate.initialize(q.getNegeri());
            Hibernate.initialize(q.getStatushaji());
            Hibernate.initialize(q.getHubungan());
            Hibernate.initialize(q.getPermohonan());
        }
        return q;
    }
    
    public PermohonanMaklumatKeluarga findMohonMaklumatKeluargaByNoAkaun(String noAkaun) {        
        String query = "SELECT a FROM PermohonanMaklumatKeluarga a WHERE a.noAkaun = :noAkaun";
        PermohonanMaklumatKeluarga q = (PermohonanMaklumatKeluarga)sessionProvider.get().createQuery(query).setString("noAkaun", noAkaun.toString()).uniqueResult();
        if(q != null){
            Hibernate.initialize(q.getStatus());
            Hibernate.initialize(q.getStatushaji());
            Hibernate.initialize(q.getNegeri());
            Hibernate.initialize(q.getHubungan());
            Hibernate.initialize(q.getPermohonan());
        }
        return q;
    }
    
    @Transactional
    public PermohonanMaklumatKeluarga saveMohonMaklumatKeluarga(PermohonanMaklumatKeluarga obj) {
        return permohonanMaklumatKeluargaDAO.saveOrUpdate(obj);
    }
    
    @Transactional
    public void deleteMohonMaklumatKeluarga(PermohonanMaklumatKeluarga obj) {
        permohonanMaklumatKeluargaDAO.delete(obj);
    } 
    
    public PermohonanMaklumatKumpulan findMohonMaklumatKumpulanById(Integer id) {        
        PermohonanMaklumatKumpulan q = permohonanMaklumatKumpulanDAO.findById(id);
        if(q != null){
            Hibernate.initialize(q.getStatushaji());
            Hibernate.initialize(q.getHubungan());
            Hibernate.initialize(q.getPermohonan());
        }
        return q;
    }
    
    public PermohonanMaklumatKumpulan findMohonMaklumatKumpulanByNoAkaun(String noAkaun) {        
        String query = "SELECT a FROM PermohonanMaklumatKumpulan a WHERE a.noAkaun = :noAkaun";
        PermohonanMaklumatKumpulan q = (PermohonanMaklumatKumpulan)sessionProvider.get().createQuery(query).setString("noAkaun", noAkaun.toString()).uniqueResult();
        if(q != null){
            Hibernate.initialize(q.getStatushaji());
            Hibernate.initialize(q.getHubungan());
            Hibernate.initialize(q.getPermohonan());
        }
        return q;
    }
    
    @Transactional
    public PermohonanMaklumatKumpulan saveMohonMaklumatKumpulan(PermohonanMaklumatKumpulan obj) {
        return permohonanMaklumatKumpulanDAO.saveOrUpdate(obj);
    }
    
    @Transactional
    public void saveMohonMaklumatKumpulan(List maklumatKumpulanList, PilihanDestinasi pdObj) {
        Iterator save_iter = maklumatKumpulanList.iterator();
        while(save_iter.hasNext()) {
            PermohonanMaklumatKumpulan objsave = (PermohonanMaklumatKumpulan)save_iter.next();
            //permohonanMaklumatKumpulanDAO.save(objsave);
            permohonanMaklumatKumpulanDAO.saveOrUpdate(objsave);
        }
        pilihanDestinasiDAO.saveOrUpdate(pdObj);
    }
    
    //newly add = by id mohon maklumat, by idKumpulan 
    @Transactional
    public void updateMohonMaklumatKumpulan(int idmohonMaklumat, int idKump, int id) {
        String query = "UPDATE PermohonanMaklumatKumpulan a set a.id_mohon_maklumat =:id_mohon_maklumat, a.id =:idKump WHERE a.id_mohon_maklumat_kumpulan =:id";
        Query q = sessionProvider.get().createQuery(query);
        q.setInteger("id_mohon_maklumat", idmohonMaklumat);
        q.setInteger("idKump", idKump);
        q.setInteger("id", id);
        q.executeUpdate();
    }

    
    //newly add
    public List findMohonMaklumatKumpulanByIdKumpulan(String id) {        
        String query = "SELECT a FROM PermohonanMaklumatKumpulan a WHERE a.id = :id";
        Query q = sessionProvider.get().createQuery(query).setString("id", id.toString());
        
        return q.list();
    }
    
    @Transactional
    public void savePilihanDestinasi(PilihanDestinasi obj) {
        pilihanDestinasiDAO.saveOrUpdate(obj);
    }
    
    @Transactional
    public void deleteMohonMaklumatKumpulan (PermohonanMaklumatKumpulan obj) {
        permohonanMaklumatKumpulanDAO.delete(obj);
    }
    
    
    @Transactional
    public void deleteMohonMaklumatKumpulan(List maklumatKumpulanList, PilihanDestinasi pdObj) {
        Iterator save_iter = maklumatKumpulanList.iterator();
        while(save_iter.hasNext()) {
            PermohonanMaklumatKumpulan objdelete = (PermohonanMaklumatKumpulan)save_iter.next();
            permohonanMaklumatKumpulanDAO.delete(objdelete);
        }
    }
   
            
    public PilihanDestinasi findPilihanDestinasiByMohonMaklumatId(Integer id) {
        String query = "SELECT a FROM PilihanDestinasi a WHERE a.permohonan.idMohonMaklumat = :id";
         PilihanDestinasi q = (PilihanDestinasi)sessionProvider.get().createQuery(query).setString("id", id.toString()).uniqueResult();
        if(q != null){
            Hibernate.initialize(q.getPermohonan());
        }
        return q;
    }
    
   
}
